import { ipcMain, app, safeStorage, BrowserWindow } from 'electron';
import fs from 'fs';
import path from 'path';
import Store from 'electron-store';
import { UserData } from '../src/types/commonType';

const store = new Store();
// 获取存储用户数据文件的路径
const getCredentialsPath = () => {
	return path.join(app.getPath('userData'), 'userCredentials.dat'); // 使用一个统一的文件
};
/**
 * 获取存储的Token
 * @returns 存储的凭据或null（如果不存在）
 */
function getAllUserData() {
	const filePath = getCredentialsPath();
	// 检查文件是否存在
	if (!fs.existsSync(filePath)) {
		console.log('存储的用户数据文件不存在');
		return null;
	}
	try {
		// 从文件读取加密后的 Buffer
		const encryptedBuffer = fs.readFileSync(filePath);
		// 使用 safeStorage 解密 Buffer
		const decryptedString = safeStorage.decryptString(encryptedBuffer);
		// 将解密后的字符串解析为 JSON 对象
		const userData: UserData = JSON.parse(decryptedString);
		return userData;
	} catch (error) {
		// 文件不存在或其他错误
		return null;
	}
}
/**
 * 存储用户数据
 * @param userData 用户数据
 */
function saveToken(userData: UserData): boolean {
	try {
		// 先获取现有的所有用户数据
		const existingData = getStoredUserDataArray() || [];

		// 检查是否已存在相同用户名的数据
		const existingIndex = existingData.findIndex(item => item.username === userData.username);

		// 如果存在，更新该用户数据；否则添加新用户数据
		if (existingIndex !== -1) {
			existingData[existingIndex] = userData;
			// 把这个数据，放在数组的第一个
			existingData.unshift(existingData.splice(existingIndex, 1)[0]);
		} else {
			// 把这个数据，放在数组的第一个
			existingData.unshift(userData);
		}

		// 将用户数据数组转换为 JSON 字符串
		const userDataString = JSON.stringify(existingData);

		// 使用 safeStorage 加密整个字符串
		const encryptedBuffer = safeStorage.encryptString(userDataString);

		// 将加密后的 Buffer 写入文件
		fs.writeFileSync(getCredentialsPath(), encryptedBuffer);
		// 存储token
		store.set('token', true);
		console.log('用户数据已加密存储');
		return true;
	} catch (error) {
		return false;
	}
}
/**
 * 读取并解密存储的所有用户数据
 * @returns 解密后的用户数据数组，或 null（如果不存在或失败）
 */
function getStoredUserDataArray(): UserData[] | null {
	// 检查加密是否可用
	if (!safeStorage.isEncryptionAvailable()) {
		console.error('加密功能在此设备上不可用');
		return null;
	}

	const filePath = getCredentialsPath();

	// 检查文件是否存在
	if (!fs.existsSync(filePath)) {
		console.log('存储的用户数据文件不存在');
		return null;
	}

	try {
		// 从文件读取加密后的 Buffer
		const encryptedBuffer = fs.readFileSync(filePath);

		// 使用 safeStorage 解密 Buffer
		const decryptedString = safeStorage.decryptString(encryptedBuffer);

		// 将解密后的字符串解析为 JSON 数组
		const userDataArray: UserData[] = JSON.parse(decryptedString);

		return userDataArray;
	} catch (error) {
		console.error('读取或解密用户数据时发生错误:', error);
		return null;
	}
}
/**
 * 最小化
 */
function minimizeWindow() {
	// 最小化当前窗口
	const window = BrowserWindow.getFocusedWindow();
	if (window) {
		window.minimize();
	}
}
/**
 * 关闭窗口
 */
function closeWindow() {
	// 关闭当前窗口
	const window = BrowserWindow.getFocusedWindow();
	if (window) {
		window.close();
	}
}
/**
 * 最大化
 */
function maximizeWindow() {
	// 获取当前窗口
	const window = BrowserWindow.getFocusedWindow();
	if (window) {
		// 窗口是否最大化
		const isMaximized = window.isMaximized();
		if (isMaximized) {
			// 窗口已最大化，取消最大化
			window.unmaximize();
		} else {
			// 窗口未最大化，最大化
			window.maximize();
		}
	}
}
/**
 * 登录后设置窗口可最大化，并且可调节大小
 */
function setWindowSize() {
	// 获取当前窗口
	const window = BrowserWindow.getFocusedWindow();
	if (window) {
		// 设置窗口可最大化
		window.setMaximizable(true);
		// 设置窗口可调节大小
		window.setResizable(true);
		// 设置窗口宽高
		window.setSize(1100, 750);
		// 窗口居中
		window.center();
	}
}
/**
 * 获取存储的token
 * @returns 存储的token
 */
function getStoreData() {
	return store.get('token');
}
/**
 * 清除token
 */
function clearToken() {
	store.delete('token');
	const window = BrowserWindow.getFocusedWindow();
	if (window) {
		window.setSize(400, 500);
		window.center();
		window.setMaximizable(false);
		window.setResizable(false);
	}
}

/**
 * 注册所有IPC处理程序
 */
export function registerIpcHandlers() {
	// 获取存储的Token
	ipcMain.handle('getAllUserData', () => getAllUserData());
	// 存储Token
	ipcMain.handle('saveToken', (event, userData: UserData): boolean => saveToken(userData));
	// 最小化
	ipcMain.handle('minimizeWindow', () => minimizeWindow());
	// 最大化
	ipcMain.handle('maximizeWindow', () => maximizeWindow());
	// 关闭窗口
	ipcMain.handle('closeWindow', () => closeWindow());
	// 设置窗口可最大化，并且可调节大小
	ipcMain.handle('setWindowSize', () => setWindowSize());
	// 获取存储的token
	ipcMain.handle('getStoreData', () => getStoreData());
	// 清除token
	ipcMain.handle('clearToken', () => clearToken());
}
